package com.java.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.junit.Test;

import com.collection.model.Student;

/*
 * 1、集合的由来：
 * 		我们学习的是面向对象语言，而面向对象语言对事物的描述是通过对象体现的，为了方便对多个对象进行操作，我们就必须把这多个对象进行存储。
 * 		而要想存储多个对象，就不能是一个基本的变量，而应该是一个容器类型的变量，在我们目前所学过的知识里面，有哪些是容器类型的呢?
 * 		数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串，不一定满足我们的要求，所以我们只能选择数组，这就是对象数组。
 * 		而对象数组又不能适应变化的需求，因为数组的长度是固定的，这个时候，为了适应变化的需求，Java就提供了集合类供我们使用。
 * 
 * 2、数组和集合的区别?
 * 		A:长度区别
 * 			数组的长度固定
 * 			集合长度可变
 * 		B:内容不同
 * 			数组存储的是同一种类型的元素
 * 			而集合可以存储不同类型的元素
 * 		C:元素的数据类型问题	
 * 			数组可以存储基本数据类型，也可以存储引用数据类型
 * 			集合只能存储引用类型
 * 
 * 3、集合的继承关系
 * 		Collection顶层接口(List子接口(ArrayList实现类,LinkedList实现类,Vector实现类),Set子接口(HashSet实现类,TreeSet实现类))
 * 
 * 4、Collection集合常用方法
 * 	1：添加元素
 * 		boolean add(Object obj):添加一个元素
 * 		boolean addAll(Collection c):添加一个集合的元素
 * 	2：删除元素
 * 		void clear():移除所有元素
 * 		boolean remove(Object o):移除一个元素
 * 		boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
 * 	3：判断元素是否存在
 * 		boolean contains(Object o)：判断集合中是否包含指定的元素
 * 		boolean containsAll(Collection c)：判断集合中是否包含指定的集合元素(是一个还是所有)
 * 		boolean isEmpty()：判断集合是否为空
 * 	4：获取集合的迭代器
 * 		Iterator<E> iterator()(重点)
 * 	5：获取集合包含的元素个数
 * 		int size():元素的个数
 * 		面试题：数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
 * 	6：把集合转换为数组
 * 		Object[] toArray()
 * 	7：取两个集合的交集
 * 		boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了，返回的boolean又是什么意思呢?
 * 		说明：
 * 			假设有两个集合A,B
 * 			操作A.retainAll(B)：A对B做交集，将A和B的共同元素存放到A中，B不发生改变，返回布尔值——表示A集合是否发生过改变
 */
public class CollectionHandle {
	
	/**
	 * 集合基本操作测试01(重点)
	 * 		Collection<String> collection = new ArrayList<>() ;
	 */
	@Test
	public void testCollectionHandle_01() {
		
		Collection<String> collection = new ArrayList<>() ;
		
		collection.add("北京市-昌平区") ;
		collection.add("北京市-海淀区") ;
		collection.add("北京市-宣武区") ;
		collection.add("北京市-大兴区") ; 
		
		System.out.println("Collection集合元素的个数:" + collection.size());
		System.out.println();
		
		System.out.println("迭代输出Collection集合中的所有元素");
		Iterator<String> iterator = collection.iterator() ;
		while(iterator.hasNext()) {
			String element = iterator.next() ;
			System.out.println(element);
		}
		System.out.println();
		
		System.out.println("Collection集合中是否包含'北京市-海淀区'的元素：" + collection.contains("北京市-海淀区"));
		System.out.println("删除集合中的'北京市-海淀区'元素");
		collection.remove("北京市-海淀区") ;
		System.out.println("Collection集合中是否包含'北京市-海淀区'的元素：" + collection.contains("北京市-海淀区"));
		System.out.println();
		
		System.out.println("迭代输出Collection集合中的所有元素");
		for (String element : collection) {
			System.out.println(element);
		}
		System.out.println();
		
		System.out.println("清除集合中的所有元素");
		collection.clear() ;
		System.out.println();
		
		System.out.println("判断集合是否为空：" + collection.isEmpty());
	}
	
	/**
	 * 集合基本操作测试02(重点)
	 * 		Collection<Student> students = new ArrayList<>() ;
	 */
	@Test
	public void testCollectionHandle_02() {
		
		Collection<Student> students = new ArrayList<>() ;
		
		Student student01 = new Student("张三01",21) ;
		Student student02 = new Student("张三02",22) ;
		Student student03 = new Student("张三03",23) ;
		Student student04 = new Student("张三04",24) ;
		
		students.add(student02) ;
		students.add(student03) ;
		students.add(student01) ;
		students.add(student04) ;
		//添加null元素
		students.add(null) ;
		students.add(student02) ;
		students.add(student03) ;
		
		System.out.println("集合中包含的元素个数：" + students.size());
		System.out.println();
		
		System.out.println("遍历输出集合中的所有元素");
		for (Student student : students) {
			System.out.println(student);
		}
		System.out.println();
		
		System.out.println("集合中是否包含'student02'的元素：" + students.contains(student02));
		System.out.println("删除集合中的'student02'元素");
		students.remove(student02) ;
		System.out.println("集合中是否包含'student02'的元素：" + students.contains(student02));
		System.out.println();
		
		System.out.println("遍历输出集合中的所有元素");
		Iterator<Student> iterator = students.iterator() ;
		while(iterator.hasNext()) {
			Student student = iterator.next() ;
			System.out.println(student);
		}
		System.out.println();
		
		System.out.println("清除集合中的所有元素");
		students.clear() ;
		System.out.println();
		
		System.out.println("判断集合是否为空:" + students.isEmpty());
		
		
		
	}
	
	/**
	 * 集合基本操作测试03
	 * 		把Collection集合转换为数组(重点)
	 */
	@Test
	public void testCollectionHandle_03() {
		
		Collection<String> collection = new ArrayList<>() ;
		
		collection.add("北京市-大兴区") ; 
		collection.add("北京市-昌平区") ;
		collection.add("北京市-海淀区") ;
		collection.add("北京市-宣武区") ;
		
		Object[] elements = collection.toArray() ;
		System.out.println("循环输出数组中的所有元素");
		for (int i = 0; i < elements.length; i++) {
			String area = (String) elements[i] ;
			System.out.println(area);
		}
	}
	
	/**
	 * 集合基本操作测试04
	 * 		取两个集合的交集
	 */
	@Test
	public void testCollectionHandle_04() {
		
		Collection<String> collection01 = new ArrayList<>() ;
		
		collection01.add("1111") ;
		collection01.add("2222") ;
		collection01.add("3333") ;
		collection01.add("4444") ;
		
		Collection<String> collection02 = new ArrayList<>() ;
		
		collection02.add("1111") ;
		collection02.add("2222") ;
		collection02.add("3333") ;
		collection02.add("4444") ;
		collection02.add("5555") ;
		collection02.add("6666") ;
		
		boolean retain = collection01.retainAll(collection02) ;
		System.out.println("collection01集合是否发生改变:" + retain);
		for (String elem : collection01) {
			System.out.println(elem);
		}
		
	}
	
	

}
